home *** CD-ROM | disk | FTP | other *** search
- #include <Aliases.h>
- #include <Traps.h>
- #include <SetUpA4.h>
-
- typedef pascal long (*PPMenuSelect)(Point);
-
- PPMenuSelect oldMenuSelect;
- Str255 cleanupMenuItemName, cleanupMenuName, cleanupMenuPrefix,
- cleanupDT;
- Str255 cleanupDesktopName;
- long menuCommands[10];
- short menuCmdNbr = 0;
- short prefixItems, curViewBy;
- short menuID;
- AliasHandle myFile;
-
- typedef struct {
- WindowPtr theWindow;
- RgnHandle visRgn;
- } WindowVisRgn;
-
- WindowVisRgn** wVis;
-
- pascal long MyMenuSelect(Point pt);
- pascal void MyEraseRect(Rect*);
- pascal void MyEraseRgn(RgnHandle);
- pascal void MyBeginUpdate(WindowPtr);
- pascal void MyEndUpdate(WindowPtr);
- void DoAbout(void);
-
- extern pascal void ShowINIT(short id, short move);
-
- pascal void main(void)
- {
- Handle me;
- THz cZone;
- FCBPBRec fcb;
- FSSpec fss;
- Str31 name;
-
- RememberA0();
- asm {
- RecoverHandle
- Move.L A0,me
- }
- SetUpA4();
-
- DetachResource(me);
-
- fcb.ioFCBIndx = 0;
- fcb.ioVRefNum = 0;
- fcb.ioRefNum = CurResFile();
- fcb.ioNamePtr = name;
-
- PBGetFCBInfoSync(&fcb);
-
- fss.vRefNum = fcb.ioFCBVRefNum;
- fss.parID = fcb.ioFCBParID;
- BlockMove(name, fss.name, 1 + name[0]);
-
- cZone = GetZone();
- SetZone(SystemZone());
-
- wVis = (WindowVisRgn**) NewHandle(0);
-
- NewAlias(nil, &fss, &myFile);
- HNoPurge((Handle) myFile);
- HUnlock((Handle) myFile);
-
- SetZone(cZone);
-
- me = Get1Resource('STR ', 128);
- if (me)
- {
- BlockMove(*me, cleanupMenuItemName, sizeof(Str255));
- ReleaseResource(me);
- }
-
- me = Get1Resource('STR ', 129);
- if (me)
- {
- BlockMove(*me, cleanupMenuName, sizeof(Str255));
- ReleaseResource(me);
- }
-
- me = Get1Resource('STR ', 130);
- if (me)
- {
- BlockMove(*me, cleanupDesktopName, sizeof(Str255));
- ReleaseResource(me);
- }
-
- me = Get1Resource('STR ', 131);
- if (me)
- {
- BlockMove(*me, cleanupMenuPrefix, sizeof(Str255));
- ReleaseResource(me);
- }
-
- me = Get1Resource('STR ', 132);
- if (me)
- {
- BlockMove(*me, cleanupDT, sizeof(Str255));
- ReleaseResource(me);
- }
-
- oldMenuSelect = (void*) GetToolTrapAddress(_MenuSelect);
- SetToolTrapAddress((void*) StripAddress((Ptr) MyMenuSelect), _MenuSelect);
-
- ShowINIT(128, -1);
-
- RestoreA4();
- }
-
- typedef pascal Boolean (*PPGNE)(short, EventRecord*);
-
- PPGNE oldGNE;
-
- pascal Boolean MyGNE(short mask, EventRecord* evt)
- {
- Boolean retVal;
-
- SetUpA4();
-
- retVal = false; //(*oldGNE)(mask, evt);
- if (!retVal && (mask & mDownMask))
- {
- evt->what = mouseDown;
- evt->message = 0;
- evt->when = TickCount();
- evt->where.h = 300;
- evt->where.v = 0;
- evt->modifiers = optionKey;
- retVal = true;
- }
-
- Exit:
- RestoreA4();
-
- return retVal;
- }
-
- Ptr oldEraseRect, oldEraseRgn, oldBeginUpdate;
-
- pascal void MyEraseRect(Rect* r)
- {
- }
-
- pascal void MyEraseRgn(RgnHandle rgn)
- {
- }
-
- pascal void MyBeginUpdate(WindowPtr wp)
- {
- THz cZone;
- WindowVisRgn wvr;
-
- SetUpA4();
-
- wvr.theWindow = wp;
- wvr.visRgn = wp->visRgn;
-
- cZone = GetZone();
-
- SetZone(HandleZone((Handle) wp->visRgn));
- wp->visRgn = NewRgn();
-
- SetZone(SystemZone());
-
- PtrAndHand(&wvr, (Handle) wVis, sizeof(WindowVisRgn));
-
- SetZone(cZone);
-
- RestoreA4();
- }
-
- pascal void MyEndUpdate(WindowPtr wp)
- {
- THz cZone, hZone;
- WindowVisRgn *wvr;
- long numEnt;
-
- SetUpA4();
-
- cZone = GetZone();
- numEnt = GetHandleSize((Handle) wVis) / sizeof(WindowVisRgn);
- wvr = *wVis;
-
- while (numEnt--)
- {
- if (wvr->theWindow == wp)
- {
- SetZone(HandleZone((Handle) wp->visRgn));
- DisposeRgn(wp->visRgn);
- wp->visRgn = wvr->visRgn;
-
- SetZone(SystemZone());
- Munger((Handle) wVis, (Ptr) wvr - (Ptr) *wVis, nil, sizeof(WindowVisRgn),
- wvr, 0);
- SetZone(cZone);
- break;
- }
- ++wvr;
- }
-
- RestoreA4();
- }
-
- typedef struct {
- MenuHandle menuOH;
- short menuLeft;
- } ItemMenu;
-
- typedef struct {
- short lastMenu;
- short lastRight;
- short mbResID;
- ItemMenu menuInfo[1]; // only need information on the Apple & File menus
- } MyMenuListRec;
-
- MenuHandle GetIndMHandle(short i)
- {
- MyMenuListRec* mlr = (MyMenuListRec*) *LMGetMenuList();
-
- if (mlr->lastMenu < (&mlr->menuInfo[i - 1] - &mlr->menuInfo[0]))
- return nil;
-
- return mlr->menuInfo[i - 1].menuOH;
- }
-
- MenuHandle BuildCleanupMenu(MenuHandle viewMenu)
- {
- MenuHandle mh;
- short i, baseItem, numItems;
- Str255 s;
-
- menuID = 1;
- while (GetMHandle(menuID))
- ++menuID;
-
- mh = NewMenu(menuID, cleanupMenuName);
-
- (**mh).menuProc = GetResource('MDEF', 0);
- CalcMenuSize(mh);
- AppendMenu(mh, cleanupMenuPrefix);
-
- prefixItems = CountMItems(mh);
-
- i = numItems = CountMItems(viewMenu); // find a dash line or first item
-
- do {
- GetItem(viewMenu, i, s);
- if (*(short*) &s[0] == '\x01-')
- break;
- --i;
- }
- while (i > 0);
-
- baseItem = i;
-
- i += 3; // start with the third item in the menu -- by Name
-
- while (i <= numItems)
- {
- GetItem(viewMenu, i++, s);
- AppendMenu(mh, s);
- }
-
- if (!((**viewMenu).enableFlags & (1L << 0))) // View menu disabled...
- goto DisableItems;
-
- GetItemMark(viewMenu, curViewBy = baseItem + 1, &i); // is "by Small Icon" selected?
- if (i != noMark)
- goto LeaveItemsEnabled;
-
- GetItemMark(viewMenu, curViewBy = baseItem + 2, &i); // is "by Icon" selected?
- if (i != noMark)
- goto LeaveItemsEnabled;
-
- DisableItems:
- curViewBy = 0;
-
- i = prefixItems + 1;
-
- numItems = CountMItems(mh);
-
- while (i <= numItems)
- DisableItem(mh, i++);
-
- LeaveItemsEnabled:
- return mh;
- }
-
- pascal long MyMenuSelect(Point pt)
- {
- long retVal;
- Boolean removeIt;
- Str255 s;
- short i, viewBy;
- MenuHandle specialMenu;
- short specialMenuID;
- MenuHandle viewMenu;
- short viewMenuID;
- MenuHandle mh;
- short mk;
-
- SetUpA4();
-
- if (EqualString(LMGetFinderName(), LMGetCurApName(), false, true))
- {
- Byte b;
-
- if (!menuCmdNbr)
- {
- specialMenu = GetIndMHandle(6);
- specialMenuID = (**specialMenu).menuID;
-
- viewMenu = GetIndMHandle(4);
- viewMenuID = (**viewMenu).menuID;
-
- mh = BuildCleanupMenu(viewMenu);
-
- if (!((**specialMenu).enableFlags & (1L << 1)))
- DisableItem(mh, 3); // disable Clean Up Window
-
- InsertMenu(mh, -1);
- SetItemCmd(specialMenu, 1, hMenuCmd);
- SetItemMark(specialMenu, 1, menuID);
- GetItem(specialMenu, 1, s);
- SetItem(specialMenu, 1, cleanupMenuItemName);
- EnableItem(specialMenu, 1);
-
- if (EqualString(s, cleanupDesktopName, false, false))
- SetItem(mh, 3, cleanupDT);
-
- retVal = (*oldMenuSelect)(pt);
-
- SetItem(specialMenu, 1, s);
- SetItemCmd(specialMenu, 1, 0);
- SetItemMark(specialMenu, 1, 0);
- DeleteMenu(menuID);
-
- if (*(short *) &retVal == menuID)
- {
- switch (((short*) &retVal)[1])
- {
- case 1: // About...
- DoAbout();
- retVal = 0;
- break;
- case 3: // Clean Up Window
- retVal = ((long) specialMenuID << 16) | 1L;
- break;
- default: // View menu items
- *(short*) &retVal = viewMenuID;
- retVal -= prefixItems - 2;
- menuCommands[menuCmdNbr++] = ((long) specialMenuID << 16) | 1L;
- menuCommands[menuCmdNbr++] = ((long) viewMenuID << 16) |
- curViewBy;
-
- oldGNE = (void*) GetToolTrapAddress(_GetNextEvent);
- SetToolTrapAddress((void*) MyGNE, _GetNextEvent);
- oldEraseRect = (Ptr) GetToolTrapAddress(_EraseRect);
- SetToolTrapAddress((void*) MyEraseRect, _EraseRect);
- oldEraseRgn = (Ptr) GetToolTrapAddress(_EraseRgn);
- SetToolTrapAddress((void*) MyEraseRgn, _EraseRgn);
- oldBeginUpdate = (Ptr) GetToolTrapAddress(_BeginUpDate);
- SetToolTrapAddress((void*) MyBeginUpdate, _BeginUpDate);
- break;
- }
- }
- }
- else
- {
- retVal = menuCommands[--menuCmdNbr];
-
- if (!menuCmdNbr && oldGNE)
- {
- SetToolTrapAddress((void*) oldGNE, _GetNextEvent);
- oldGNE = nil;
- SetToolTrapAddress((void*) oldEraseRect, _EraseRect);
- SetToolTrapAddress((void*) oldEraseRgn, _EraseRgn);
- SetToolTrapAddress((void*) oldBeginUpdate, _BeginUpDate);
- }
- }
- }
- else
- retVal = (*oldMenuSelect)(pt);
-
- RestoreA4();
-
- return(retVal);
- }
-
- void DoAbout(void)
- {
- FSSpec fss;
- Boolean chg;
- short cResFile = CurResFile();
- short extFile;
-
- ResolveAlias(nil, myFile, &fss, &chg);
-
- extFile = FSpOpenResFile(&fss, fsCurPerm);
-
- if (extFile == -1)
- {
- UseResFile(cResFile);
- SysBeep(10);
- return;
- }
-
- UseResFile(extFile);
-
- Alert(128, nil);
-
- CloseResFile(extFile);
-
- UseResFile(cResFile);
- }